package com.ruoyi.generator.domain

import com.ruoyi.common.constant.GenConstants
import com.ruoyi.common.core.domain.BaseEntity
import org.apache.commons.lang3.ArrayUtils
import javax.validation.Valid
import javax.validation.constraints.NotBlank

/**
 * 业务表 gen_table
 *
 * @author ruoyi
 */
class GenTable : BaseEntity() {
    /** 编号  */
    @JvmField
    var tableId: Long? = null

    /** 表名称  */
    @JvmField
    var tableName: @NotBlank(message = "表名称不能为空") String? = null

    /** 表描述  */
    @JvmField
    var tableComment: @NotBlank(message = "表描述不能为空") String? = null

    /** 关联父表的表名  */
    @JvmField
    var subTableName: String? = null

    /** 本表关联父表的外键名  */
    @JvmField
    var subTableFkName: String? = null

    /** 实体类名称(首字母大写)  */
    @JvmField
    var className: @NotBlank(message = "实体类名称不能为空") String? = null

    /** 使用的模板（crud单表操作 tree树表操作 sub主子表操作）  */
    @JvmField
    var tplCategory: String? = null

    /** 前端类型（element-ui模版 element-plus模版）  */
    @JvmField
    var tplWebType: String? = null

    /** 生成包路径  */
    @JvmField
    var packageName: @NotBlank(message = "生成包路径不能为空") String? = null

    /** 生成模块名  */
    @JvmField
    var moduleName: @NotBlank(message = "生成模块名不能为空") String? = null

    /** 生成业务名  */
    @JvmField
    var businessName: @NotBlank(message = "生成业务名不能为空") String? = null

    /** 生成功能名  */
    @JvmField
    var functionName: @NotBlank(message = "生成功能名不能为空") String? = null

    /** 生成作者  */
    @JvmField
    var functionAuthor: @NotBlank(message = "作者不能为空") String? = null

    /** 生成代码方式（0zip压缩包 1自定义路径）  */
    var genType: String? = null

    /** 生成路径（不填默认项目路径）  */
    @JvmField
    var genPath: String? = null

    /** 主键信息  */
    @JvmField
    var pkColumn: GenTableColumn? = null

    /** 子表信息  */
    @JvmField
    var subTable: GenTable? = null

    /** 表列信息  */
    @JvmField
    var columns: @Valid MutableList<GenTableColumn>? = null

    /** 其它生成选项  */
    @JvmField
    var options: String? = null

    /** 树编码字段  */
    @JvmField
    var treeCode: String? = null

    /** 树父编码字段  */
    @JvmField
    var treeParentCode: String? = null

    /** 树名称字段  */
    @JvmField
    var treeName: String? = null

    /** 上级菜单ID字段  */
    @JvmField
    var parentMenuId: String? = null

    /** 上级菜单名称字段  */
    @JvmField
    var parentMenuName: String? = null
    val isSub: Boolean
        get() = isSub(tplCategory)
    val isTree: Boolean
        get() = isTree(tplCategory)
    val isCrud: Boolean
        get() = isCrud(tplCategory)

    fun isSuperColumn(javaField: String?): Boolean {
        return isSuperColumn(tplCategory, javaField)
    }

    companion object {
        private const val serialVersionUID = 1L
        fun isSub(tplCategory: String?): Boolean {
            return tplCategory != null && GenConstants.TPL_SUB==tplCategory
        }

        fun isTree(tplCategory: String?): Boolean {
            return tplCategory != null && GenConstants.TPL_TREE==tplCategory
        }

        fun isCrud(tplCategory: String?): Boolean {
            return tplCategory != null && GenConstants.TPL_CRUD==tplCategory
        }

        fun isSuperColumn(tplCategory: String?, javaField: String?): Boolean {
            return if (isTree(tplCategory)) {
                org.apache.commons.lang3.StringUtils.equalsAnyIgnoreCase(javaField,
                        *ArrayUtils.addAll(GenConstants.TREE_ENTITY, *GenConstants.BASE_ENTITY))
            } else org.apache.commons.lang3.StringUtils.equalsAnyIgnoreCase(javaField, *GenConstants.BASE_ENTITY)
        }
    }
}
